package org.groupg.filetodb.model.database;


import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;

import java.io.Serializable;

/**
 * 表示表列元数据
 */
public class Column implements Serializable {
    /**
     * 表目录
     */
    private String tableCat;
    /**
     * 表模式
     */
    private String tableSchem;
    /**
     * 表名
     */
    private String tableName;
    /**
     * 列名
     */
    private String columnName;
    /**
     * SQL类型 (对应 java.sql.Types)
     */
    private int dataType;
    /**
     * 数据库类型名称
     */
    private String typeName;
    /**
     * 列大小
     */
    private int columnSize;
    /**
     * 小数位数
     */
    private Integer decimalDigits;
    /**
     * 基数（通常为10或2）
     */
    private int numPrecRadix;
    /**
     * 是否允许NULL (0=no, 1=yes, 2=unknown)
     */
    private int nullable;
    /**
     * 列注释
     */
    private String remarks;
    /**
     * 默认值
     */
    private String columnDef;
    /**
     * SQL数据类型（未使用）
     */
    private int sqlDataType;
    /**
     * 日期时间子类型（未使用）
     */
    private int sqlDatetimeSub;
    /**
     * 字符最大字节长度
     */
    private int charOctetLength;
    /**
     * 表中列的位置（从1开始）
     */
    private int ordinalPosition;
    /**
     * "YES"/"NO"/"" 表示是否可空
     */
    private String isNullable;
    /**
     * 是否自增 ("YES"/"NO")
     */
    private String isAutoincrement;

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("tableCat", tableCat)
                .add("tableSchem", tableSchem)
                .add("tableName", tableName)
                .add("columnName", columnName)
                .add("dataType", dataType)
                .add("typeName", typeName)
                .add("columnSize", columnSize)
                .add("decimalDigits", decimalDigits)
                .add("numPrecRadix", numPrecRadix)
                .add("nullable", nullable)
                .add("remarks", remarks)
                .add("columnDef", columnDef)
                .add("sqlDataType", sqlDataType)
                .add("sqlDatetimeSub", sqlDatetimeSub)
                .add("charOctetLength", charOctetLength)
                .add("ordinalPosition", ordinalPosition)
                .add("isNullable", isNullable)
                .add("isAutoincrement", isAutoincrement)
                .toString();
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Column column = (Column) o;
        return getDataType() == column.getDataType() && getColumnSize() == column.getColumnSize() && getNumPrecRadix() == column.getNumPrecRadix() && getNullable() == column.getNullable() && getSqlDataType() == column.getSqlDataType() && getSqlDatetimeSub() == column.getSqlDatetimeSub() && getCharOctetLength() == column.getCharOctetLength() && getOrdinalPosition() == column.getOrdinalPosition() && Objects.equal(getTableCat(), column.getTableCat()) && Objects.equal(getTableSchem(), column.getTableSchem()) && Objects.equal(getTableName(), column.getTableName()) && Objects.equal(getColumnName(), column.getColumnName()) && Objects.equal(getTypeName(), column.getTypeName()) && Objects.equal(getDecimalDigits(), column.getDecimalDigits()) && Objects.equal(getRemarks(), column.getRemarks()) && Objects.equal(getColumnDef(), column.getColumnDef()) && Objects.equal(getIsNullable(), column.getIsNullable()) && Objects.equal(getIsAutoincrement(), column.getIsAutoincrement());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getTableCat(), getTableSchem(), getTableName(), getColumnName(), getDataType(), getTypeName(), getColumnSize(), getDecimalDigits(), getNumPrecRadix(), getNullable(), getRemarks(), getColumnDef(), getSqlDataType(), getSqlDatetimeSub(), getCharOctetLength(), getOrdinalPosition(), getIsNullable(), getIsAutoincrement());
    }

    public String getTableCat() {
        return tableCat;
    }

    public void setTableCat(String tableCat) {
        this.tableCat = tableCat;
    }

    public String getTableSchem() {
        return tableSchem;
    }

    public void setTableSchem(String tableSchem) {
        this.tableSchem = tableSchem;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getColumnName() {
        return columnName;
    }

    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    public int getDataType() {
        return dataType;
    }

    public void setDataType(int dataType) {
        this.dataType = dataType;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public int getColumnSize() {
        return columnSize;
    }

    public void setColumnSize(int columnSize) {
        this.columnSize = columnSize;
    }

    public Integer getDecimalDigits() {
        return decimalDigits;
    }

    public void setDecimalDigits(Integer decimalDigits) {
        this.decimalDigits = decimalDigits;
    }

    public int getNumPrecRadix() {
        return numPrecRadix;
    }

    public void setNumPrecRadix(int numPrecRadix) {
        this.numPrecRadix = numPrecRadix;
    }

    public int getNullable() {
        return nullable;
    }

    public void setNullable(int nullable) {
        this.nullable = nullable;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    public String getColumnDef() {
        return columnDef;
    }

    public void setColumnDef(String columnDef) {
        this.columnDef = columnDef;
    }

    public int getSqlDataType() {
        return sqlDataType;
    }

    public void setSqlDataType(int sqlDataType) {
        this.sqlDataType = sqlDataType;
    }

    public int getSqlDatetimeSub() {
        return sqlDatetimeSub;
    }

    public void setSqlDatetimeSub(int sqlDatetimeSub) {
        this.sqlDatetimeSub = sqlDatetimeSub;
    }

    public int getCharOctetLength() {
        return charOctetLength;
    }

    public void setCharOctetLength(int charOctetLength) {
        this.charOctetLength = charOctetLength;
    }

    public int getOrdinalPosition() {
        return ordinalPosition;
    }

    public void setOrdinalPosition(int ordinalPosition) {
        this.ordinalPosition = ordinalPosition;
    }

    public String getIsNullable() {
        return isNullable;
    }

    public void setIsNullable(String isNullable) {
        this.isNullable = isNullable;
    }

    public String getIsAutoincrement() {
        return isAutoincrement;
    }

    public void setIsAutoincrement(String isAutoincrement) {
        this.isAutoincrement = isAutoincrement;
    }
}
